﻿namespace est3
{
    internal class class3
    {
        static void Main(string[] args)
        {
            Console.WriteLine("二维数组");
            #region     知识点一  基本概念
            //二维数组  是使用两个下标（索引）来确定元素的数组
            //两个下标可以理解成 行标和列标
            //比如矩阵
            //1 2 3
            //4 5 6
            //可以用二维数组 int[2,3]表示
            //两列三行↑

            #endregion

            #region     知识点二  二维数组的申明
            //变量类型[,] 二维数组变量名
            int[,] arr;//申明过后 会在后面进行初始化（必须的）

            //变量类型[,] 二维数组变量名=new 变量类型[行,列];
            int[,] arr2 = new int[3, 3];

            //变量类型[,] 二维数组变量名=new 变量类型[行,列]{{0行内容1,0行内容2,0行内容3.....},{1行内容1,1行内容2.....}};
            int[,] arr3 = new int[3, 3] { { 1,2,3 },
                                          { 4,5,6 },
                                          { 7,8,9 } };
            //变量类型[,] 二维数组变量名=new 变量类型[,]{{0行内容1,0行内容2,0行内容3.....},{1行内容1,1行内容2.....}};
            int[,] arr4 = new int[,] { { 1,2,3 },
                                       { 4,5,6 },
                                       { 7,8,9 } };
            //变量类型[,] 二维数组变量名={{0行内容1,0行内容2,0行内容3.....},{1行内容1,1行内容2.....}};
            int[,] arr5 ={ { 1,2,3 },
                           { 4,5,6 },
                           { 7,8,9 } };
            #endregion

            #region     知识点三   二维数组的使用
            int[,] arr6 = new int[,] { { 1, 2, 3 },
                                       { 4, 5, 6 } };
            //1.二维数组的长度
            Console.WriteLine(arr6.GetLength(0));//得到行数
            Console.WriteLine(arr6.GetLength(1));//得到列数
            
            //2.获取二维数组中的元素
            //注意：第一个元素的索引是0，最后一个元素的索引  肯定是长度-1
            Console.WriteLine(arr6[0,2]);
            Console.WriteLine(arr6[1,2]);
            //Console.WriteLine(arr6[3,2]);这个会报错，因为越界了

            //3.修改二维数组中的元素
            arr6[0, 1] = 63;//修改第一行第二列的元素
            Console.WriteLine(arr6[0, 1]);

            //4.遍历二维数组
            Console.WriteLine("**************************************");
            for (int i = 0; i < arr6.GetLength(0); i++)//行的循环
            {
                for (int j = 0; j < arr6.GetLength(1); j++)//列的循环
                {
                    Console.WriteLine(arr6[i, j]);
                }
            }

            //5.增加数组的元素
            //数组 声明初始化过后 就不能在原有的基础上进行 添加或删除
            int[,] arr7 = new int[3, 3];
            for (int i = 0;i < arr6.GetLength(0); i++)
            {
                for(int j = 0;j < arr6.GetLength(1); j++)
                {
                    arr7[i, j] = arr6[i, j];
                }
            }
            arr6 = arr7;
            arr6[2, 0] = 7; arr6[2, 1] = 8; arr6[2, 2] = 9;
            Console.WriteLine("**************************************");
            for (int i = 0; i < arr6.GetLength(0); i++)
            {
                for (int j = 0; j < arr6.GetLength(1); j++)
                {
                    Console.WriteLine(arr6[i,j]);
                }
            }

            //6.删除数组的元素
            Console.WriteLine("**************************************");
            int[,] arr8 = new int[2, 2];
            for (int i = 0;i<arr8.GetLength(0) ; i++)
            {
                for (int j = 0; j < arr8.GetLength(1); j++)
                {
                    arr8[i, j] = arr6[i, j];
                }
            }
            arr6= arr8;
            for (int i = 0; i<arr6.GetLength(0); i++)
            {
                for(int j = 0;j<arr6.GetLength(1); j++)
                {
                    Console.WriteLine(arr6[i,j]);
                }
            }

            //7.查找数组中的元素
            int a = 63;
            Console.WriteLine("**************************************");
            for (int i = 0; i < arr6.GetLength(0); i++)//行的循环
            {
                for (int j = 0; j < arr6.GetLength(1); j++)//列的循环
                {
                    if (arr6[i,j]==a)
                    {
                        Console.WriteLine("与a相同的元素位置在第{0}列，第{1}行",i+1,j+1);
                        break;
                    }
                }
            }


            #endregion

            //总结：
            //1.概念：同一变量类型的行列数据集合
            //2.一定要掌握的内容：申明，遍历，增删查改
            //3.所有的变量类型都可以申明为二维数组
            //4.游戏一般用来存储 矩阵，在控制台小游戏中可以用二维数组 来表示地图格子

            #region   作业
            //1.将1到10000赋值给一个二维数组（100行100列）
            int[,] array= new int[100, 100];
            int num0 = 1;//从1开始
            for (int i = 0;i<array.GetLength(0) ; i++)
            {
                for (int j=0;j<array.GetLength(1) ; j++)
                {
                    array[i, j] = num0++;
                    Console.WriteLine(array[i,j]);
                }
            }

            //2.将二维数组（4行4列）的右上半部分置零（元素随机1~100）
            Console.WriteLine("****************************************");
            int[,] array1= new int[4, 4];
            Random num1 = new Random();
            for (int i = 0;i < array1.GetLength(0) ; i++)
            {
                for (int j = 0; j < array1.GetLength(1); j++)
                {
                    array1[i, j] = num1.Next(1, 101);
                    if (i <= 1 && j > 1)
                    {
                        array1[i, j] = 0;
                    }
                    else
                    {
                        array1[i, j] = num1.Next(1,101);
                    }
                        Console.Write(array1[i, j]+" ");
                }
                Console.WriteLine();
            }

            //3.求二维数组（3行3列）的对角线元素的和（元素随机1~10）
            Console.WriteLine("****************************************");
            int[,] array2 = new int[3, 3];
            Random num2 = new Random();
            int num3 = 0, num4 = 0;
            for(int i = 0; i < array2.GetLength(0) ;i++)
            {
                for(int j = 0;j < array2.GetLength(1); j++)
                {
                    array2[i, j] = num2.Next(1, 11);
                    if (i ==j)//去找规律去
                    {
                        num3 += array2[i, j];
                    }
                    if(i+j==2)//同上
                    {
                        num4 += array2[i, j];
                    }

                    Console.Write(array2[i, j] + " ");
                    
                }
                Console.WriteLine();
            }
            Console.WriteLine("对角线的和分别为{0}和{1}", num3, num4);

            //4.求二维数组（5行5列）中最大元素值及其行列号（元素随机1~500）
            Console.WriteLine("****************************************");
            int[,] array3= new int[5, 5];
            Random num5= new Random();
            int num6 = 0;
            for (int i = 0;i < array3.GetLength(0) ; i++)
            {
                for (int j = 0; j < array3.GetLength(1); j++)
                {
                    array3 [i, j] = num5.Next(1, 501);
                    if (num6 < array3[i,j])
                    {
                        num6 = array3[i,j];
                    }
                    
                    Console.Write(array3[i,j]+" ");
                }
                Console.WriteLine();
            }
            //查找
            for (int i = 0; i < array3.GetLength(0); i++)
            {
                for(int j = 0;j < array3.GetLength(1); j++)
                {
                    if (array3[i,j]==num6)
                    {
                        Console.WriteLine("最大元素为{0}，行列号为[{1},{2}]",num6,i,j);
                    }
                }
            }
            //5.给一个M*N的二维数组，数组元素的值为0或者1，要求转换数组，将含有1的行和列全部置1
            Console.WriteLine("****************************************");
            int[,] array4 = new int[6, 6] { { 0, 0, 0, 0, 1, 0 },
                                            { 1, 0, 0, 0, 0, 1 },
                                            { 0, 1, 0, 0, 0, 0 },
                                            { 0, 0, 0, 0, 0, 0 },
                                            { 0, 0, 0, 0, 0, 0 },
                                            { 0, 0, 0, 0, 0, 0,} };
            Random num7 = new Random();
            bool[] hang= new bool[6];//条件判断确定行
            bool[] lie= new bool[6];//确定列
            for (int i = 0;i<array4.GetLength(0) ; i++)
            {
                for (int j = 0; j < array4.GetLength(1); j++)
                {
                    //array4[i, j] = num7.Next(0,2);
                    if (array4[i,j]==1)
                    {
                        hang[i] = true;
                        lie[j] = true;
                    }
                    Console.Write(array4[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine("****************************************");
            for (int i = 0;i<array4.GetLength(0) ; i++)
            {
                for (int j = 0; j < array4.GetLength(1); j++)
                {
                    if (hang[i] || lie[j])//默认true
                    {
                        array4[i, j] = 1;
                    }
                    Console.Write(array4[i,j]+" ");
                }
                Console.WriteLine();
            }

            #endregion
        }
    }
}
